﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace ExamSharedClasses {
    /// <summary>
    /// Das Sessionobjekt ist das, was zwischen Client und Server ausgetauscht wird.
    /// Man kann in ihr Benutzerinformationen (eigentlich nur zum Login) und Befehle
    /// austauschen, die wiederrum alle möglichen Objekte enthalten können.
    /// </summary>
    [Serializable()]
    public class Session {

        public string SessionId { get; set; }
        public User User { get; set; }
        public Command Command { get; set; }

        public Session() : this( "", null, null ) { }
        public Session( string sessionId ) : this( sessionId, null, null ) { }
        public Session( string sessionId, User user ) : this( sessionId, user, null ) { }
        public Session( string sessionId, Command command ) : this( sessionId, null, command ) { }
        public Session( string sessionId, User user, Command command ) {
            this.SessionId = sessionId;
            this.User = user;
            this.Command = command;
        }
        public Session( Command command ) : this( "", null, command ) { }

        /// <summary>
        /// (k) Es wird mit der Tools.GenerateSHA1Hash-Methode ein Hash erzeugt, der sich aus
        /// String des momentanen Datums, der Benutzer-E-Mail-Adresse und einer Zufallszahl
        /// zusammensetzt. Dieser wird dann der SessionId-Property zugewiesen.
        /// </summary>
        public void GenerateSessionId() {
            if ( User != null )
                SessionId = Tools.GenerateSHA1Hash( DateTime.Now.ToString() + User.UserEmail + new Random().Next() );
        }

        /// <summary>
        /// Ergibt true, wenn der übergebe String der SessionId-Property gleicht.
        /// </summary>
        /// <param name="session"></param>
        /// <returns></returns>
        public bool Validate( Session session ) {
            return SessionId == session.SessionId;
        }
        /// <summary>
        /// Ergibt true, wenn SessionId leer, und User und Command auf null zeigen...
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty() {
            return ( ( SessionId.Equals( "" ) ) && ( User == null ) && ( Command == null ) );
        }
        public override string ToString() {
            StringBuilder sb = new StringBuilder( "Session; " );

            if ( (SessionId != null) && (SessionId.Length>5) )
                sb.Append( "Id: " + SessionId.Substring(0,5) + "..., " );
            else
                sb.Append( "ohne Id, " );

            if ( User != null )
                sb.Append( User.UserEmail + ", " );
            else
                sb.Append( "ohne User, " );

            if ( Command != null )
                sb.Append( Command.GetType().ToString().Replace( "ExamSharedClasses.Commands.", "" ) );
            else
                sb.Append( "ohne Command" );

            return sb.ToString().Trim().Trim( ',' );
        }
    }
}